package com.kgc.controller;


import com.kgc.constants.Constants;
import com.kgc.dto.Result;
import com.kgc.dto.UsersDto;
import com.kgc.pojo.Evaluate;
import com.kgc.req.AppointmentReq;
import com.kgc.service.EvaluateService;
import com.kgc.service.MaintainOrderService;
import com.kgc.service.UsersService;
import com.kgc.utils.DateUtils;
import com.kgc.utils.ResultUtils;
import com.kgc.utils.redis.RedisKeyUtils;
import com.kgc.utils.redis.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Map;

/**
 * <p>
 * 维修订单 前端控制器
 * </p>
 *
 * @author zsy
 * @since 2021-08-04
 */
@RestController
@RequestMapping("/api/order")
public class MaintainOrderController {

    @Autowired
    private EvaluateService evaluateService;
    @Autowired
    private UsersService usersService;
    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private MaintainOrderService maintainOrderService;

    @PostMapping("/maintain/submit")
    public Result<Map<String, String>> submit(AppointmentReq appointmentReq, Long evaluateId, HttpServletRequest request){


        Map<String, String> map = null;

        // 校验评估信息
        Evaluate evaluate = evaluateService.getById(evaluateId);
        if (evaluate == null) {
            return ResultUtils.returnFail("没有评估对象");
        }

        // 校验用户登录信息
        // 获取用户token
        String token = request.getHeader("token");
        // 调用根据token获取用户信息的方法
        UsersDto user = usersService.getLoginByToken(token);
        if (user == null) {
            return ResultUtils.returnFail("登录用户异常");
        }

        // 1.校验预约地址 主要是长度
        String address = appointmentReq.getAdress();
        if (address == null || address.length() > 100) {
            return ResultUtils.returnFail("预约地址异常");
        }

        // 2.校验日期
        Date appintDate = appointmentReq.getAppintDate();
        if (!this.checkAppIntDate(appintDate)) {
            return ResultUtils.returnFail("预约日期异常");
        }

        // 3.校验时间
        Integer interval = appointmentReq.getTemporalInterval();
        if (!this.checkInterval(interval)) {
            return ResultUtils.returnFail("预约时间异常");
        }

        // 4.校验手机号
        String phone = appointmentReq.getPhone();
        if (!phone.matches(Constants.PHONE_REGSTR)) {
            return ResultUtils.returnFail("预约手机号异常");
        }

//        // 5.校验验证码
//        String sms = appointmentReq.getSms();
//        if (!this.checkSms(phone, Constants.Sms.TYPE_SUBMIT_CHECK, sms)) {
//            return ResultUtils.returnFail("预约验证码异常");
//        }

        appointmentReq.setUserId(user.getId()); // 设置用户id
        // 第一个参数是预约评估对象 第二个参数是评估id 第三个参数是商品id
        try {
            map = maintainOrderService.submit(appointmentReq, evaluate);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResultUtils.returnDataSuccess(map);

    }

    private boolean checkAppIntDate(Date appIntDate) {
        boolean flag = false;
        // 规则：1.预约事件能够早于当前日期 2.不能晚于当前时间4天
        // 怎么去对比一个日期：compareTo 大于返回1 等于返回0 小于返回-1
        // 1.获取当前时间
        Date currentDate = DateUtils.getCurrentDate(DateUtils.YYYY_MM_DD);
        // 1.1 对于规则1 如果currentDate > appIntDate 1 我们只能让这个时间大于等0
        int i = appIntDate.compareTo(currentDate);

        // 1.2 对于规则2，把当前的时间需要加上4天
        // 4天后的时间
        Date date = DateUtils.addDate(currentDate, 4);
        // 预约时间不能超过当前时间4天，返回值要小于等于1
        int i1 = appIntDate.compareTo(date);
        if (i >= 0 && i1 <= 1) {
            flag = true;
        }
        return flag;

    }

    private boolean checkInterval(Integer interval) {
        boolean flag = false;
        if (interval != null && (interval.equals(Constants.Order.TemporalInterval.AM) ||
                interval.equals(Constants.Order.TemporalInterval.NOON) ||
                interval.equals(Constants.Order.TemporalInterval.PM) ||
                interval.equals(Constants.Order.TemporalInterval.NIGHT)
        )) {
            flag = true;
        }
        return flag;
    }

    private boolean checkSms(String phone, Integer codeType, String sms) {
        boolean flag = false;
        // 1.拼接前缀
        String key = RedisKeyUtils.formatKeyWithPrefix(Constants.Redis.PREFIX_SMS, codeType.toString(), phone);
        // 2.去redis中查寻验证码
        String value = redisUtils.getValue(key);
        // 3.跟参数的验证码对比
        if (sms.equals(value)) {
            flag = true;
        }
        return flag;
    }
}

